/*
 * AbstractTag.java
 *
 * Created on 26 febbraio 2003, 19.53
 *
 */

package net.ermannofranco.xml;

import java.util.Enumeration;

/**
 * Questa interfaccia formalizza il comportamento di un Tag.
 * 
 * @author ermanno (ermanno.franco@gmail.com)
 */

public interface AbstractTag extends ITag {

	/**
	 * @param nome
	 * @param valore
	 * @return
	 */
	// public AbstractTag addAttr(String nome, String valore);
	/**
	 * aggiunge un namespace (xmlns)
	 * 
	 * @param nome
	 *            prefisso del ns
	 * @param uri
	 *            indirizzo del ns
	 * @return autoref
	 */
	public AbstractTag addNS(Namespace ns);

	/**
	 * Imposta il namespace del tag e di quelli contenuti, salvo diversa
	 * indicazione.
	 * 
	 * @return autoref
	 */
	public AbstractTag setLocalNS(Namespace ns);

	/**
	 * restituisce il prefisso del namespace
	 * 
	 * @return restituisce il prefisso del namespace
	 */
	public String getLocalNS();

	/**
	 * rimuove l'attributo specificato
	 * 
	 * @param nome
	 *            nome attributo
	 * @return il valore dell'attributo rimosso
	 */
	public String removeAttribute(String nome);

	/**
	 * ottiene il valore dato il nome dell'attributo
	 * 
	 * @param nome
	 *            nome attributo
	 * @return il valore dell'attributo
	 */
	public String getAttribute(String nome);

	/**
	 * fornisce il modo per leggere gli attributi di un tag
	 * 
	 * @return l'Enumeration degli attributi
	 */
	public Enumeration<String> getAttributes();

	/**
	 * aggiunge un testo codificato trasformando i simboli non permessi nelle
	 * entita' corrisponenti
	 * 
	 * @param text
	 *            il testo
	 * @return autoref
	 */
	public AbstractTag addTextBlock(String text);

	/**
	 * aggiunge un testo NON codificato,cosi' com'e'
	 * 
	 * @param cdata
	 *            il testo
	 * @return autoref
	 */
	public AbstractTag addCDATA(String cdata);

	/**
	 * crea ed aggiunge un tag alla collezione interna
	 * 
	 * @param nome
	 *            nome del tag
	 * @return l'oggetto tag creato ed aggiunto
	 */
	public Tag addTag(String nome);

	// da pensare bene...

	/**
	 * Set a comment before the tag.
	 * 
	 * @param comment
	 *            il testo del commento
	 * @return autoref
	 */
	public AbstractTag setComment(String comment);

	/**
	 * Restituisce un riferimento al documento contenitore.
	 * 
	 * @return un riferimento al documento contenitore
	 */
	public Doc getDocument();

	/**
	 * Restituisce il livello di profondita'.
	 * 
	 * @return il livello di profondita'
	 */
	public int getLevel();
}
